package com.itheima.exception;

import com.itheima.pojo.Result;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 因为我们无法使用try-catch捕获进入controller之前的异常
 * 但是可以使用AOP对controller进行调用之前的增强
 * 因此RestControllerAdvice注解相当于环绕controller
 */
@RestControllerAdvice
public class GlobalExceptionHandler {

    //需要全局捕获的异常类型
    @ExceptionHandler(ArithmeticException.class)
    //用于设置浏览器的状态码
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public Result handleArithmeticException(ArithmeticException exception) {
        return Result.fail(exception.getMessage());
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public Result handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) {
        String defaultMessage = exception.getBindingResult().getFieldError().getDefaultMessage();
        Object rejectedValue = exception.getBindingResult().getFieldError().getRejectedValue();
        return Result.fail(defaultMessage, rejectedValue);
    }

}
/**
 * 给一个类的属性(成员变量)赋值 有几种方式: 四种
 * 1. 直接等于号赋值
 * 2. 构造器赋值
 * 3. setter方法赋值
 * 4. 反射
 * @Autowired 一般使用构造器赋值和set方法赋值
 * 所以说SpringDI注入有三种方式
 * 字段(属性)DI -> @Resource
 * 构造器DI -> @Autowired
 * set方法DI -> @Autowired
 */